home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib16.dsk
/
GRAPHICS 3D.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
5KB
|
146 lines
10 REM ************************
20 REM * GRAPHICS 3D *
30 REM * BY RICHARD GOLDSTEIN *
40 REM * COPYRIGHT (C) 1983 *
50 REM * BY MICROSPARC, INC. *
60 REM * LINCOLN, MA. 01773 *
70 REM ************************
80 TEXT : HOME : PRINT "** COPYRIGHT 1983 BY MICROSPARC, INC. **": PRINT : PRINT
90 DIM H(279),L(279)
100 MM = 1E10:UH = -MM:UL = MM:VH = -MM:VL = MM
110 FOR I = 0 TO 279:L(I) = 191: NEXT
120 PRINT "LINE OF SIGHT:": INPUT "XE,YE,ZE=";XE,YE,ZE
130 S1 = XE *XE +YE *YE:S2 = SQR(S1):S3 = SQR(S1 +ZE *ZE):S4 = 1/(S2 *S3)
140 INPUT "M=";M: INPUT "N=";N
150 DIM X(M),Y(N),R(M,N,1)
160 INPUT "XLOW =";XL: INPUT "XHIGH=";XH: INPUT "YLOW =";YL: INPUT "YHIGH=";YH
170 DX = (XH -XL)/M:DY = (YH -YL)/N
180 X0 = XH: IF XE <0 THEN DX = -DX:X0 = XL
190 Y0 = YH: IF YE <0 THEN DY = -DY:Y0 = YL
200 CX = 140:CY = 96
210 FOR I = 0 TO M:X(I) = X0 -I *DX: NEXT
220 FOR J = 0 TO N:Y(J) = Y0 -J *DY: NEXT
230 FOR I = 0 TO M: FOR J = 0 TO N
240 X = X(I):Y = Y(J)
250 REM ***
260 REM * REPLACEABLE FUNCTION *
270 REM ** Z = F(X,Y) FOLLOWS **
280 REM ***
290 Z = EXP( -X *X -Y *Y)
300 REM ***
310 REM ***
320 GOSUB 890
330 R(I,J,0) = U:R(I,J,1) = V: GOSUB 1420
340 NEXT J: VTAB 14: PRINT "I=";I,"MAX=";M: NEXT I
350 REM S=SCALE FACTOR
360 S = MM: IF UL = 0 THEN 380
370 S0 = 139/ ABS(UL): IF S0 <S THEN S = S0
380 IF UH = 0 THEN 400
390 S0 = 139/ ABS(UH): IF S0 <S THEN S = S0
400 IF VL = 0 THEN 420
410 S0 = 95/ ABS(VL): IF S0 <S THEN S = S0
420 IF VH = 0 THEN 450
430 S0 = 95/ ABS(VH): IF S0 <S THEN S = S0
440 REM LOCATE IN HGR2 COORDINATES
450 FOR I = 0 TO M: FOR J = 0 TO N
460 R(I,J,0) = INT(S *R(I,J,0) +CX):R(I,J,1) = INT(S *R(I,J,1) +CY)
470 NEXT J: NEXT I
480 REM START GRAPHICS
490 HGR2 : HCOLOR= 3
500 IF ABS(XE) < ABS(YE) THEN 670
510 FOR I = 0 TO M
520 REM DRAW FIXED X LINES
530 FOR J = 1 TO N
540 U1 = R(I,J -1,0):V1 = R(I,J -1,1):U2 = R(I,J,0):V2 = R(I,J,1)
550 GOSUB 950: REM TEST VISIBILITY AND PLOT
560 GOSUB 1220: REM UPDATE H,L ARRAYS
570 NEXT J
580 IF I = M THEN 650
590 REM DRAW FIXED Y LINE SEGMENTS
600 FOR J = 0 TO N
610 U1 = R(I,J,0):V1 = R(I,J,1):U2 = R(I +1,J,0):V2 = R(I +1,J,1)
620 GOSUB 950: REM TEST VISIBILITY AND PLOT
630 GOSUB 1220: REM UPDATE H,L ARRAYS
640 NEXT J
650 NEXT I
660 GOTO 820
670 FOR J = 0 TO N
680 REM DRAW FIXED Y LINES
690 FOR I = 1 TO M
700 U1 = R(I -1,J,0):V1 = R(I -1,J,1):U2 = R(I,J,0):V2 = R(I,J,1)
710 GOSUB 950
720 GOSUB 1220
730 NEXT I
740 IF J = N THEN 810
750 REM DRAW FIXED X LINE SEGMENTS
760 FOR I = 0 TO M
770 U1 = R(I,J,0):V1 = R(I,J,1):U2 = R(I,J +1,0):V2 = R(I,J +1,1)
780 GOSUB 950
790 GOSUB 1220
800 NEXT I
810 NEXT J
820 PRINT CHR$(7): INPUT "PAPER OUTPUT (Y/N)?";Q$: IF Q$ < >"Y" THEN END
830 PR# 1
840 PRINT : POKE -12524,0: POKE -12525,64: PRINT CHR$(17): PR# 0
850 TEXT : END
860 REM ***
870 REM * TRANSFORMATION SUBROUTINE *
880 REM ***
890 U = (XE *Y -YE *X)/S2
900 V = (ZE *(X *XE +Y *YE) -S1 *Z) *S4
910 RETURN
920 REM ***
930 REM * WRIGHT'S ALGORITHM *
940 REM ***
950 T1 = 0:T2 = 0:G1 = 0:G2 = 0
960 IF V1 > = H(U1) THEN T1 = 1
970 IF V2 > = H(U2) THEN T2 = 1
980 IF V1 < = L(U1) THEN G1 = 1
990 IF V2 < = L(U2) THEN G2 = 1
1000 IF T1 = 1 AND T2 = 1 THEN HPLOT U1,V1 TO U2,V2: RETURN
1010 IF G1 = 1 AND G2 = 1 THEN HPLOT U1,V1 TO U2,V2: RETURN
1020 IF T1 +T2 +G1 +G2 = 0 THEN RETURN
1030 GOSUB 1370
1040 IF KM = KX THEN 1160
1050 F1 = 0:F2 = 0
1060 FOR K = KM TO KX
1070 VK = VM +(VX -VM) *(K -KM)/(KX -KM)
1080 IF VK >H(K) OR VK <L(K) THEN U1 = K:V1 = VK:F1 = 1:K = KX
1090 NEXT
1100 FOR K = KX TO KM STEP -1
1110 VK = VM +(VX -VM) *(K -KM)/(KX -KM)
1120 IF VK >H(K) OR VK <L(K) THEN U2 = K:V2 = VK:F2 = 1:K = KM
1130 NEXT
1140 IF F1 = 1 AND F2 = 1 THEN HPLOT U1,V1 TO U2,V2
1150 RETURN
1160 IF VX >H(U1) THEN HPLOT U1,H(U1) TO U1,VX: RETURN
1170 IF VM <L(U1) THEN HPLOT U1,L(U1) TO U1,VM
1180 RETURN
1190 REM ***
1200 REM * UPDATE H AND L ARRAYS *
1210 REM ***
1220 IF V1 >H(U1) THEN H(U1) = V1
1230 IF V2 >H(U2) THEN H(U2) = V2
1240 IF V1 <L(U1) THEN L(U1) = V1
1250 IF V2 <L(U2) THEN L(U2) = V2
1260 IF ABS(U1 -U2) < = 1 THEN RETURN
1270 GOSUB 1370
1280 FOR K = KM +1 TO KX -1
1290 VK = VM +(VX -VM) *(K -KM)/(KX -KM)
1300 IF VK >H(K) THEN H(K) = VK
1310 IF VK <L(K) THEN L(K) = VK
1320 NEXT K
1330 RETURN
1340 REM ***
1350 REM * FIND LEFTMOST POINT ON THE LINE *
1360 REM ***
1370 KM = U1:KX = U2:VM = V1:VX = V2: IF KM >KX THEN KM = U2:KX = U1:VM = V2:VX = V1: RETURN
1380 RETURN
1390 REM ***
1400 REM * FIND EXTREME VALUES IN U,V COORD. BEFORE SCALING *
1410 REM ***
1420 IF U >UH THEN UH = U
1430 IF U <UL THEN UL = U
1440 IF V >VH THEN VH = V
1450 IF V <VL THEN VL = V
1460 RETURN